package com.chang.order.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

/**
 * @author: changzhenxi
 * @date: 2025年01月09日 09:44
 * @Version: 1.0
 * @description: feign在远程调用之前会构造请求, 调用很多的拦截器, 而默认构造的新的请求是没有请求头的, 自然也就没有请求头携带的cookie,
 * 进而没有cookie中的jsessionId.自然也就无法获取数据库中的共享session信息,以及储存的用户信息
 * 所以这里可以加上feign远程调用的请求拦截器 将拦截到的请求头放到新请求中,(新版本好像不配置也可以)
 * 而一个请求到controller再到service,再到拦截器都是同一个线程的请求,所以可以用本地线程来获取
 */
@Configuration
public class FeignConfig {
    @Bean("requestInterceptor")
    public RequestInterceptor requestInterceptor() {

        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate requestTemplate) {
                // 使用RequestContextHolder拿到刚拦截到的请求
                ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                System.out.println("Thread.currentThread().getId() = " + Thread.currentThread().getId());
                HttpServletRequest request = null; // 老请求
                if (requestAttributes != null) {
                    request = requestAttributes.getRequest();
                    // 同步请求头数据 往新的请求里面放拦截到的请求头
                    requestTemplate.header("Cookie", request.getHeader("Cookie"));
                }
            }
        };
    }
}
